package com.bt.springboot.common.util;

import com.bt.springboot.entity.Person;
import org.apache.commons.collections4.ListUtils;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @author zkx
 * @Date 2022/4/26 13:40
 */
public class ListUtil {

	public static void main(String[] args) {
		Person[] persons1 = {Person.builder().id(1L).name("张三").age(20).build(),
				Person.builder().id(2L).name("李四").age(21).build(),
				Person.builder().id(3L).name("王五").age(22).build(),
				Person.builder().id(4L).name("赵六").age(23).build()};

		Person[] persons2 = {Person.builder().id(1L).name("张三").age(20).build(),
				Person.builder().id(2L).name("李四").age(21).build(),
				Person.builder().id(3L).name("王五").age(22).build(),
				Person.builder().id(4L).name("赵六").age(23).build()};
		List<Person> list1 = Arrays.asList(persons1);
		List<Person> list2 = Arrays.asList(persons2);
		List<Person> list3 = null;

		// 1.集合去重
//		System.out.println("------去重------");
//		List<Person> newList = ListUtil.duplicateRem(list1);
//		newList.forEach(System.out::println);
//
//		// 2.集合取交集
//		System.out.println("------交集------");
//		List<Person> intersection = ListUtil.getIntersection(newList, list2);
//		intersection.forEach(System.out::println);
//		// 3.集合取差集
//		System.out.println("------差集------");
//		List<Person> difference = ListUtil.getDifference(list2, list1);
//		difference.forEach(System.out::println);
//		// 4.集合取并集
//		System.out.println("------并集不去重------");
//		List<Person> and = ListUtil.getAnd(list1, list2, false);
//		and.forEach(System.out::println);
//		// 5.集合取并集去重
//		System.out.println("------并集去重------");
//		List<Person> andRemDupl = ListUtil.getAnd(list1, list2, true);
//		andRemDupl.forEach(System.out::println);
		// 6.集合 按照某个字段排序
//		System.out.println("------排序------");
//		ListUtil.sort(list1);
//		ListUtil.sort(list2);
//		list1.forEach(System.out::println);
//		List<List<Person>> lists = splitList(list1, 2);
//		System.out.println(lists);
		List<Person> difference = getDifference(list1, list3);
		System.out.println(difference);
	}

	/**
	 * 集合去重
	 *
	 * @param list
	 * @return
	 */
	public static List<Person> duplicateRem(List<Person> list) {

		List<Person> newList = new ArrayList<>();
		list.forEach(obj -> {
			if (!newList.contains(obj)) {
				newList.add(obj);
			}
		});

		return newList;
	}

	/**
	 * 取两个集合交集
	 *
	 * @param list1
	 * @param list2
	 * @return
	 */
	public static List<Person> getIntersection(List<Person> list1, List<Person> list2) {
		return list1.stream().filter(list2::contains).collect(Collectors.toList());
	}

	/**
	 * 取两个集合差集
	 *
	 * @param list1
	 * @param list2
	 * @return
	 */
	public static List<Person> getDifference(List<Person> list1, List<Person> list2) {
		return list1.stream().filter(item -> !list2.contains(item)).collect(Collectors.toList());
	}

	/**
	 * 取两个集合并集
	 * @param list1
	 * @param list2
	 * @param remDupl
	 * @return
	 */
	public static List<Person> getAnd(List<Person> list1, List<Person> list2, boolean remDupl) {
		List<Person> listAll1 = list1.parallelStream().collect(Collectors.toList());
		List<Person> listAll2 = list2.parallelStream().collect(Collectors.toList());
		listAll1.addAll(listAll2);
		if (remDupl) {
			return listAll1.stream().distinct().collect(Collectors.toList());
		}
		return listAll1;
	}

	/**
	 * 排序
	 * @param list
	 */
	public static void sort(List<Person> list){
		list.sort(Comparator.comparing(Person::getAge));
	}

	/**
	 * 分割集合
	 * @param list
	 * @param chunkSize
	 * @return
	 */
	public static List<List<Person>> splitList(List<Person> list, int chunkSize) {
		return ListUtils.partition(list, chunkSize);
	}


}
